#!/usr/bin/env node

const readline = require('readline');
const io = require('socket.io-client');

// 创建readline接口
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: 'FM-Simulator> '
});

// 连接到服务器
const socket = io('http://localhost:3005', {
  transports: ['websocket', 'polling'],
  timeout: 20000,
  reconnection: true,
  reconnectionAttempts: 10,
  reconnectionDelay: 1000,
  reconnectionDelayMax: 5000,
  randomizationFactor: 0.5,
  upgrade: true,
  forceNew: true,
  rejectUnauthorized: false
});

// 命令帮助信息
const helpText = `
金融市场模拟器命令行控制台
可用命令:
  start          - 启动模拟
  stop           - 停止模拟
  reset          - 重置市场
  status         - 查看市场状态
  config         - 查看当前配置
  config <key>=<value> - 更新配置项
  help           - 显示帮助信息
  exit           - 退出控制台
`;

console.log('连接到金融市场模拟器...');
console.log('输入 "help" 查看可用命令');

// 处理连接成功
socket.on('connect', () => {
  console.log('已连接到服务器');
  rl.prompt();
});

// 处理连接错误
socket.on('connect_error', (error) => {
  console.error('连接服务器失败:', error.message);
  console.log('错误详情:', error);
});

// 处理连接超时
socket.on('connect_timeout', (timeout) => {
  console.error('连接服务器超时:', timeout);
});

// 处理断开连接
socket.on('disconnect', (reason) => {
  console.error('与服务器断开连接:', reason);
});

// 处理重新连接尝试
socket.on('reconnect_attempt', (attemptNumber) => {
  console.log('尝试重新连接:', attemptNumber);
});

// 处理重新连接成功
socket.on('reconnect', (attemptNumber) => {
  console.log('重新连接成功，尝试次数:', attemptNumber);
});

// 处理重新连接失败
socket.on('reconnect_failed', () => {
  console.error('重新连接失败');
});

// 处理市场更新
socket.on('marketUpdate', (data) => {
  console.log(`\n[市场更新] 时间: ${data.time}, 投资者: ${Object.keys(data.investors).length}, 资产: ${Object.keys(data.assets).length}`);
  rl.prompt();
});

// 处理市场重置
socket.on('marketReset', () => {
  console.log('\n[系统消息] 市场已重置');
  rl.prompt();
});

// 处理用户输入
rl.on('line', (line) => {
  const command = line.trim();
  
  if (command === 'exit') {
    rl.close();
    return;
  }
  
  if (command === 'help') {
    console.log(helpText);
    rl.prompt();
    return;
  }
  
  if (command === 'start') {
    socket.emit('startSimulation');
    console.log('已发送启动命令');
    rl.prompt();
    return;
  }
  
  if (command === 'stop') {
    socket.emit('stopSimulation');
    console.log('已发送停止命令');
    rl.prompt();
    return;
  }
  
  if (command === 'reset') {
    socket.emit('resetMarket');
    console.log('已发送重置命令');
    rl.prompt();
    return;
  }
  
  if (command === 'status') {
    // 请求市场状态
    fetch('http://localhost:3005/api/market')
      .then(response => response.json())
      .then(data => {
        if (data.error) {
          console.log(`状态: ${data.error}`);
        } else {
          console.log(`状态: 运行中`);
          console.log(`时间: ${data.time}`);
          console.log(`投资者数量: ${Object.keys(data.investors).length}`);
          console.log(`资产数量: ${Object.keys(data.assets).length}`);
        }
        rl.prompt();
      })
      .catch(error => {
        console.error('获取状态失败:', error.message);
        rl.prompt();
      });
    return;
  }
  
  if (command === 'config') {
    // 请求配置信息
    fetch('http://localhost:3005/api/config')
      .then(response => response.json())
      .then(data => {
        console.log('当前配置:');
        console.log(JSON.stringify(data, null, 2));
        rl.prompt();
      })
      .catch(error => {
        console.error('获取配置失败:', error.message);
        rl.prompt();
      });
    return;
  }
  
  if (command.startsWith('config ')) {
    // 更新配置
    const configStr = command.substring(7);
    const [key, value] = configStr.split('=');
    
    if (!key || !value) {
      console.log('配置格式错误，请使用: config <key>=<value>');
      rl.prompt();
      return;
    }
    
    const config = {};
    if (key === 'timeStep') {
      config[key] = parseInt(value);
    } else if (key === 'macroEventProbability' || key === 'investorEntryRate') {
      config[key] = parseFloat(value);
    } else {
      config[key] = value;
    }
    
    socket.emit('updateConfig', config);
    console.log(`已更新配置: ${key} = ${value}`);
    rl.prompt();
    return;
  }
  
  if (command) {
    console.log(`未知命令: ${command}`);
    console.log('输入 "help" 查看可用命令');
  }
  
  rl.prompt();
}).on('close', () => {
  console.log('再见!');
  process.exit(0);
});

// 初始提示
rl.prompt();